/*
    定义数据表相关数据结构和函数
*/
#ifndef TABLE_HEAD_DEFINE
#define TABLE_HEAD_DEFINE

#include "struct.h"
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<pthread.h>
#include<time.h>
#include<iostream>
#include "BPTree.h"

#define TABLE_FILE "table" // 表存储文件名


class table {

public:
    static table *GetTable(); // 获取table对象指针
    void InsertRecord(); // 添加记录
    void SearchRecord(int lowerBound, int upperBound, int col); // 查询第col列属性值位于区间(lowerBound,upperBound)的所有记录


private:
    table();
    ~table();
    Record CreateRecord(); // 创建一条随机记录
    bool AppendRecord(const Record &record); // 保存一条记录
    BPTreeNode* CreateBPTree(int col); // 为第col列的属性创建B+树
    void UpdateIndexFile(int col); // 更新索引文件
    void CreateIndexFile(BPTreeNode* root, int col);
    void DisplayRecord(const Record &record); // 显示记录
    bool IsIndexExists(int col); // 判断索引文件是否存在
    void InitializeTable(); // 初始化表格
    static pthread_mutex_t *InitializeMutex(); // 初始化互斥量

    int tFd; // 文件描述符
    int64_t recordNum; // 表中现有记录数量
    Record* records; // 存储记录

    BPTree* tree; // B+树

    // 互斥访问表
    pthread_mutex_t *pMutexForOperatingTable; 
    // 用于table实例的创建，保证只创建一个table实例
    static pthread_mutex_t *pMutexForCreatingTable;

    static table *threadTable;

};


#endif // TABLE_HEAD_DEFINE
